<?php

/**
 * Редактирование пользователей фронтенда.
 *
 */
class User_Backend_Create_Edit extends Kernel_Action_Form_Simple
{
    
    /**
     * Элементы основной таблицы, которые нужно исключить из формы.
     *
     * @var array
     */
    protected $_exclude = array('subject_id', 'deleted');
    
    /**
    * Элементы таблицы субъекта безопасности, кот нужно исключить
    */
    protected $_subject_exclude = array('password');
    
    /**
     * Путь к файлу шаблона.
     *
     * @var string
     */
    protected $_template = 'backend/component/form.tpl';

    /**
     * Таблица, в которой хранится редактируемый элемент.
     *
     * @var string
     */
    protected $_table = 'user_user';
    
    /**
     * Инициализирует элементы формы.
     *
     */
    protected function _initElements()
    {
        
        parent::_initElements();
        
        $this->_setElementParam('role', array(
            'type' => 'list',
            'values' => User_Utils::getRoles(), 
            'null' => Kernel_Config::get('user', 'select_role'), 
        ));
        
        $this->_addSecurityElements();
    }
    
    /**
    * @desc Обработка полей субъекта безопасности
    */
    protected function _addSecurityElements()
    {
        // поднимаем дополнительные поля профайла
        $this->_profile_fields = $this->_fromTable(
            'system_subject', 
            $this->_subject_exclude
            );
        
        $this->_setElementParam('email', array(
            'validators' => array('email', array(
                    'Security_Validator_Login',
                    array(
                        'subject' => Security_Utils_Subject::getSubjectByProfile($this->id, Security_Subject::USER),
            )))));
        $this->_setAsRequired('name', 'role', 'email');
        
        // пароль меняем отдельно
        if ($this->_isNew()) {
            $this->_addElement('password1', 'password', array(
                'required' => true,
                'note' => '8-12 characters',
                'validators' => array('password'),
            ));
            
            $this->_addElement('password2', 'password', array(
                'required' => true 
                ));
        }
    }
    
    /**
     * Загружает данные формы + субъекта безопасности.
     *
     * @return  array
     */
    protected function _load() 
    {
        $subject_data = User_Utils::getSystemSubjectData($this->id);
        return array_merge(
            parent::_load(), 
            array('email' => $subject_data['email'])
            );
    }
    
    /**
     * Определяет текущую роль
     *
     */
    protected function _save()
    {
        $query = '
            SELECT 
                   `title` 
              FROM 
                   `strategy` 
             WHERE 
                   `role` = "' . $this->_getValue('role') . '"
            ';
        
        $this->_factory(
            database::fetchOne($query), 
            $this->_getValues() + array('id' => $this->id)
            );
    }
    
    /**
     * @desc Отдаем на выполнение текущей роли.
     *
     */
    private function _factory($type, $params = null) 
    {
        $this->_forward(Kernel::factory('User_Backend_Strategy', $type, $params));
    }
    
    /**
    * @desc Перенаправляем ручками на список.
    * 
    */
    protected function _done() 
    {
        $section = Application::getRequest()->get('section')
            ? Application::getRequest()->get('section')
            : Backend_Filter_Structure::get('section');
        $this->_location('?section=' . $section . '&action=list');
    }
    
}
